/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

/**
 *
 * @author Ivan
 */
public class Estado {
    private int[][] matriz;
    private int fila_vacio;
    private int columna_vacio;
    private int metrica;
    private boolean esFinal;
    private static int vacio=8;

    public int getColumna_vacio() {
        return columna_vacio;
    }

    public void setColumna_vacio(int columna_vacio) {
        this.columna_vacio = columna_vacio;
    }

    public int getFila_vacio() {
        return fila_vacio;
    }

    public void setFila_vacio(int fila_vacio) {
        this.fila_vacio = fila_vacio;
    }

    public static int getVacio() {
        return vacio;
    }

    public static void setVacio(int vacio) {
        Estado.vacio = vacio;
    }

    
    

    public Estado() {
    }

    public Estado(int[][] matriz) {
        this.matriz = matriz;
        esFinal=false;
        metrica=-1;
        
    }

    
    public Estado(int[][] matriz, int metrica, boolean esFinal,int vacio) {
        this.matriz = matriz;
        this.metrica = metrica;
        this.esFinal = esFinal;
        this.vacio=vacio;
    }

    public boolean isEsFinal() {
        return esFinal;
    }

    public void setEsFinal(boolean esFinal) {
        this.esFinal = esFinal;
    }

    public int[][] getMatriz() {
        return matriz;
    }

    public void setMatriz(int[][] matriz) {
        this.matriz = matriz;
    }

    public int getMetrica() {
        return metrica;
    }

    public void setMetrica(int metrica) {
        this.metrica = metrica;
    }

    public void calcularMetrica(Estado estadoFinal){

        int temp=0;
        for(int i=0;i < matriz.length;i++){
            for(int j=0;j <matriz[0].length;j++ ){
                 if(matriz[i][j]!=estadoFinal.getMatriz()[i][j]){
                    temp++;
                }
            }
        }
        this.metrica=temp;
        if(metrica==0)
            esFinal=true;
        else
            esFinal=false;
        obtenerEsFinal(estadoFinal);
        
    }

    public void calcularMetricaAAesterisco(int nivel, Estado estadoFinal){

        int temp=0;
        for(int i=0;i < matriz.length;i++){
            for(int j=0;j <matriz[0].length;j++ ){
                 if(matriz[i][j]!=estadoFinal.getMatriz()[i][j]){
                    temp++;
                }
            }
        }
        this.metrica=temp + nivel;
        this.obtenerEsFinal(estadoFinal);

    }
    @Override
    public String toString() {
        String cadena="";

        for(int i=0;i < matriz.length;i++){
            cadena+="\n========================\n";
            for(int j=0;j <matriz[0].length;j++ ){
                cadena+="| " + matriz[i][j] + " ||";
            }
        }
        return cadena;
    }



    public void obtenerEsFinal(Estado estadoFinal){

        for(int i=0;i < matriz.length;i++){
            for(int j=0;j <matriz[0].length;j++ ){
                 if(matriz[i][j]!=estadoFinal.getMatriz()[i][j]){
                    esFinal=false;
                    return;
                }
            }
        }
        esFinal=true;
        return;
    }

    public boolean esIgual(Estado estado){
         for(int i=0;i < matriz.length;i++){
            for(int j=0;j <matriz[0].length;j++ ){
                 if(matriz[i][j]!=estado.getMatriz()[i][j]){
                    return false;
                }
            }
        }
         return true;
    }


}
